package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.Employee;
import com.itheima.common.PageBean;
import com.itheima.common.R;
import com.itheima.exception.CustomException;
import com.itheima.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;

@Slf4j
@RequestMapping("/employee")
@RestController
public class EmployeeController {

    @Autowired
    private EmployeeService employeeService;

    /**
     * 员工登录
     * @param emp
     * @return
     */
    @PostMapping("/login")
    public R<Employee> login(@RequestBody Employee emp, HttpSession session){

        //0、用户名非空判断
        if(emp.getUsername()==null || emp.getUsername().length()==0){
            return R.error("用户名不能为空！");
        }

        //1、将页面提交的密码password进行md5加密处理
        String password = emp.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());

        //2、根据页面提交的用户名username查询数据库
        //2.1:创建LambdaQueryWrapper对象
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        //2.2：设置查询条件
        wrapper.eq(Employee::getUsername,emp.getUsername());
        //2.3：执行查询 传入wrapper对象
        Employee employee = employeeService.getOne(wrapper);    //employee:根据用户名从数据库中查询出来的 emp：封装员工账号和密码数据的对象

        //3、如果没有查询到则返回登录失败结果 						"用户不存在"
        if(employee==null){
            return R.error("用户不存在");
        }

        //4、密码比对，如果不一致则返回登录失败结果					  "密码错误"
        if(!employee.getPassword().equals(password)){
            return R.error("密码错误");
        }

        //5、查看员工状态，如果为已禁用状态，则返回员工已禁用结果		 "员工已禁用"
        if(employee.getStatus()==0){
            return R.error("员工已禁用");
        }

        //6、登录成功，将员工id存入Session并返回登录成功结果
        session.setAttribute("employee",employee.getId());
        return R.success(employee);
    }

    /**
     * 员工退出
     * @return
     */
    @PostMapping("/logout")
    public R<String> loginout(HttpSession session){
        //1.清除session中的"employee"
        //session.removeAttribute("employee"); //这种方式用户退出了 关联的session还在服务器内存中，只是清除了用户id信息 其他信息数据还在
        session.invalidate(); //用户退出 立即销毁对应的session对象

        //2.返回“退出成功”
        return R.success("退出成功！");
    }

    /**
     * 员工新增
     * @param emp
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Employee emp,HttpSession session){

        //1.根据用户名查询数据库employee表，判断用户名是否存在，存在则提示"用户名‘xxx’已存在"
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Employee::getUsername,emp.getUsername());
        Employee one = employeeService.getOne(wrapper);
        if(one!=null){
            //return R.error("用户名【"+emp.getUsername()+"】已存在");
            throw new CustomException("用户名【"+emp.getUsername()+"】已存在"); //使用全局异常处理器完成
        }


        //2.补全Employee对象字段数据
        //password：默认"123456" 使用MD5加密
        emp.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        //status：状态为1 新增员工默认启用
        emp.setStatus(1);
        //createTime和updateTime：默认为当前系统时间  使用公共字段自动填充替换掉
        /*emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());*/
        //createUser和updateUser：默认为当前登录系统的员工id  使用公共字段自动填充替换掉
        /*Long employeeId = (Long) session.getAttribute("employee");
        emp.setCreateUser(employeeId);
        emp.setUpdateUser(employeeId);*/

        //3.调用service完成业务处理
        boolean flag = employeeService.save(emp);

        //4.响应"新增成功"
        return flag?R.success("新增成功"):R.error("新增失败");
    }

    /**
     * 员工分页查询
     * @param page          当前页码
     * @param pageSize      每页显示条数
     * @param name          员工姓名
     * @return
     */
    @GetMapping("/page")
    public R<PageBean> selectPage(@RequestParam(defaultValue="1") Integer page, @RequestParam(defaultValue="10") Integer pageSize, String name){
        //0.配置MyBatisPlus分页拦截器
        //1.创建Page对象 设置分页参数【当前页码、每页显示条数】
        Page<Employee> employeePage = new Page<>(page, pageSize);

        //2.创建wrapper对象 设置查询条件【员工姓名 name】
        LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(name!=null&&name.length()>0,Employee::getName,name);

        //3.调用Service方法完成分页查询
        employeeService.page(employeePage,wrapper);

        //4.将分页查询的当前页数据和总条数封装到PageBean对象中，响应给客户端
        PageBean<Employee> pageBean = new PageBean<>(employeePage.getRecords(), employeePage.getTotal());
        return R.success(pageBean);
    }


    /**
     * 启用禁用员工账号|编辑员工
     * @param emp
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody Employee emp,HttpSession session){
        log.info("EmployeeController 线程id="+Thread.currentThread().getId());

        //0.判断员工用户名不能重复 【根据修改后的员工用户名查询数据库 返回Employee对象 为null:不存在，不为null：存在】
        //通过判断用户名不为null 表示此时执行的是编辑员工  不是启用禁用员工账号
        if(emp.getUsername()!=null && emp.getUsername().length()>0){
            LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(Employee::getUsername,emp.getUsername());    //根据用户名查询
            wrapper.ne(Employee::getId,emp.getId());                //排除当前用户这条记录去查询  ne：不等于

            Employee one = employeeService.getOne(wrapper);
            if(one!=null){
                throw new CustomException("员工用户名【"+emp.getUsername()+"】已存在！");
            }
        }

        //1.修改时重新设置公共字段【修改时间、修改人】   使用公共字段自动填充替换掉
        /*emp.setUpdateTime(LocalDateTime.now());
        emp.setUpdateUser((Long) session.getAttribute("employee"));*/

        //2.调用service完成修改
        boolean flag = employeeService.updateById(emp);

        //3.响应修改成功|失败
        return flag?R.success("修改成功"):R.error("修改失败");
    }

    /**
     * 根据id查询员工信息
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable Long id){

        //1.调用service根据id查询员工信息
        Employee employee = employeeService.getById(id);

        //2.返回员工信息
        return R.success(employee);
    }


}
